<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<link type="text/css" rel="stylesheet" href="../source/css/bootstrap.css" />
<link type="text/css" rel="stylesheet" href="../source/css/bootstrap-responsive.css" />
<link type="text/css" rel="stylesheet" href="../source/css/docs.css" />
<link type="text/css" rel="stylesheet" href="../source/css/monokai.css" />
<link type="text/css" rel="stylesheet" href="../source/css/font-awesome.css">

<script type="text/javascript" src="../source/js/jquery-1.9.1.js"></script>
<script type="text/javascript" src="../source/js/bootstrap.js"></script>
<script type="text/javascript" src="../source/js/highlight.pack.js"></script>
<script type="text/x-mathjax-config"> 
    MathJax.Hub.Config({ 
        tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]} 
    }); 
</script>
<script type="text/javascript"
    src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
<title>Maximization</title>

</head>
<body data-spy="scroll" data-target=".bs-docs-sidebar">
<div class="navbar navbar-fixed-top">
    <div class="navbar-inner">
        <div class="container">
            <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
            <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </a>

            <!-- Be sure to leave the brand out there if you want it shown -->
            <a class="brand" href="../index.html">Wahacer's blogs</a>

            <!-- Everything you want hidden at 940px or less, place within here -->
            <div class="nav-collapse collapse">
                <!-- .nav, .navbar-search, .navbar-form, etc -->
                <ul class="nav">
                    <li class="">
                        <a href="../index.html">Index</a>
                    </li>
                    
                    <li class="">
                        <a href="../Solution/index.html">Solution</a>
                    </li>
                    
                    <li class="">
                        <a href="../Algorithm/index.html">Algorithm</a>
                    </li>
                    

                </ul>
            </div>
        </div>
    </div>
</div>

<div class="container-fluid">
    <div class="row-fluid">
        <!--　侧边拦 -->
        <div class="span2 bs-docs-sidebar">
            <br><br><br>
            <div align="center"><img src="../source/picture/photo.jpg" alt="photo" width="250" height="250" /></div>
            <p align="center"><strong>Wahacer</strong></p>

        </div>

        <!-- 主内容　-->
        <div class="span8">
            <br>
            <!--Body content-->
            <h1 id="toc-0">极大化思想</h1>
<h2 id="toc-1">极大化思想适用于解决最大子矩形问题。</h2>
<p>即：在一个给定的矩形中有一些障碍点，对于这些障碍点，我们需要找一个最大的子矩形，子矩形需要保证在这个轮廓内不包含任何障碍点，以及轮廓上是可以有点的，但是这个轮廓是与整个矩形平行或者是重合。</p>
<p><strong>有效子矩形：内部不含任何障碍点的，同时边界与坐标轴是平行的子矩形。</strong></p>
<p><strong>极大子矩形：每条边都不能向外拓展的有效子矩形。</strong></p>
<p><strong>最大子矩形：所有有效子矩形中最大的一个或者多个。</strong></p>
<p><strong>极大化思想：在一个有障碍点的矩形钟的最大子矩形一个是一个极大子矩形。</strong></p>
<p><strong>Max_rectangle=max(max(effective_rectangle，maximun_rectangle)，Max_rectangle)；</strong></p>
<h4 id="toc-2">思路：</h4>
<p>通过枚举所有的极大子矩形，找出最大子矩形。
根据障碍点数和矩形面积不同，分出两种算法，算法一为障碍点数少的情况，算法二为矩形
面积小的算法。</p>
<hr>
<h3 id="toc-3">算法一：</h3>
<p>时间复杂度:</p>
<p>[O(s^2)]</p>
<p>空间复杂度：</p>
<p>[O(NM)]</p>
<h4 id="toc-4">思路：</h4>
<p>从极大子矩形的性质入手。</p>
<p>极大子矩形的性质：一个极大组举行的每一条边一定都不能向外扩展。更进一步地说，一个有效子矩形是极大子矩形的条件是这个子矩形的每条边要么覆盖了障碍点，要么与整个矩形的边界重合。</p>
<h4 id="toc-5">基本思路：枚举。</h4>
<p>枚举上下左右四个边界，然后判断组成的这个矩形是不是有效子矩形。</p>
<p>时间复杂度</p>
<p>[O(S^5)]</p>
<p>改进的地方：因为枚举了所有的矩形，所以一定会有大量的无效子矩形。</p>
<h4 id="toc-6">进阶：</h4>
<p>枚举左右边界，对处在边界内的点排序。每两个相邻的点和左右边界一起组成一个矩形。</p>
<p>时间复杂度</p>
<p>[O(S^3)]</p>
<p>改进的地方：枚举了部分不是极大子矩形的地方</p>
<h4 id="toc-7">设计算法方向：</h4>
<p>1、保证每一个枚举的子矩形都是有效的。</p>
<p>2、保证每一个枚举的子矩形都是极大的。</p>
<h4 id="toc-8">过程：</h4>
<p>枚举极大子矩形的左边界，根据这个左边界，找相关的极大子矩形。</p>
<h4 id="toc-9">算法优缺点：</h4>
<p>优点：利用了极大化思想，编程实现简单。</p>
<p>缺点：不适用与障碍点较密集的情况。</p>
<hr>
<h3 id="toc-10">算法二：</h3>
<h4 id="toc-11">思路：</h4>
<p>因为算法1优使用的局限性，所以需要考虑当点分布十分密集的情况。所以依赖于整个矩形的面积设计一种算法。</p>
<h4 id="toc-12">悬线：</h4>
<p><strong>有效竖线：除了两个端点外，不覆盖任何障碍点的竖直线段</strong>。</p>
<p><strong>悬线：上端点覆盖了一个障碍点或达到整个矩形上端的有效竖线。</strong></p>
<p>每个悬线都与他底部的点一一对应。</p>
<p>矩形中的每一个点(除了矩形顶部的点)都对应了一个悬线。</p>
<p>悬线个数：(N-1)*M</p>
<p>如果把一个极大子矩形按X周不同切割成多个悬线，则其中至少存在一个合法悬线。并且将这一条悬线通过尽可能地左右移动就可以得到一个子矩形，虽然不是极大子矩形，但是这样来说就只能往下扩展。</p>
<h5 id="toc-13">定理：</h5>
<p>如果将一个悬线向左右两个方向尽可能移动所得到的有效子矩形成为这个悬线所对应的子矩形，那么<strong>所有悬线所对应的有效子矩形的集合一定包含了所有极大子矩形的集合</strong></p>
<p>这里的尽可能就是把这个左右两条框一直移到障碍点或者是边界处位置。</p>
<h5 id="toc-14">最终思路：</h5>
<p>那么算法就可以出来了，通过枚举所有的悬线，就可以枚举出所有的极大子矩形。由于每个选项县都与它底部的那个店一一对应，所以悬线的个数=（N-1）*M</p>
<p>在时间复杂度在 O（NM）内完成这个题就需要醉倒对每个悬线的操作时间为 O（1）。</p>
<p>我们知道，每一个极大子矩形都可以通过一个悬线左右评议得到。所以对于每一个确定了的悬线，一定要知道他的顶部位置，左右最多移动到的位置。</p>
<p>对于底部为（i，j）的悬线，设他的高为 H[i][j]，左右最多移动位置 L[i][j]， R[i][j]。递推出枚举的每一个悬线的H、L、R即可。</p>
<p>以点（i，j）为底部的悬线。</p>
<p>如果点（i-1，j）为障碍点，那么显然以（i，j）为底的悬线高度为1，而且左右均可以移动到整个矩形的左右边界，</p>
<table>
<thead><tr>
<th>信息</th>
<th>数值 </th>
</tr>
</thead>
<tbody>
<tr>
<td>H[i][j]</td>
<td>1</td>
</tr>
<tr>
<td>L[i][j]</td>
<td>0</td>
</tr>
<tr>
<td>R[i][j]</td>
<td>m</td>
</tr>
</tbody>
</table>
<p>如果这个不是障碍点，那么以（i，j）为底的悬线就等于以（i-1，j）为底的悬线 + 点（i-1，j）的线段。</p>
<p>故：</p>
<p>H[i][j] = H[i-1][j] + 1；</p>
<p>L[i][j] = max（L[i-1][j]，（i-1，j）左边第一个障碍点的位置）。</p>
<p>R的求法类似</p>
<h5 id="toc-15">综上所述：</h5>
<p>H[i][j] = H[i-1][j] +1;</p>
<p>L[i][j] = max（L[i-1][j]，（i-1，j）左边第一个障碍点位置）</p>
<p>R[i][j] = min（R[i-1][j]，（i-1，j）右边第一个障碍点位置）</p>
<p>面积 S 为（R[i][j] - L[i][j]）* H[i][j]</p>
<p>所以这个问题最后的解就是</p>
<p>ret = （R[i][j] - L[i][j]）* H[i][j] <strong>(1&lt;=i&lt;n,1&lt;=j&lt;=m)</strong></p>
<p>那么这个时间复杂度和空间复杂度都是O（NM）的。</p>
<h5 id="toc-16">算法对比：</h5>
<p>首先时间复杂度不一样，那么就会适用于不同的情况，从时间来考虑，第一种算法对障碍点洗漱的情况比较有效，第二种算法则与障碍点个数没有多少关系，当然有离散化的操作，不过加上离散化，不如第一种算法。</p>
<p>QwQ</p>
<hr>
<h4 id="toc-17">推广一： 最大权值子矩形问题</h4>
<p>模型：在一个带正权矩形中有一些障碍点，找出一个不包含障碍点的最大权值子矩形。</p>
<p>分析：在一个正权值的矩形中的最大权值子矩形一定是极大子矩形。所以，问题实际上可以依据极大化的思想，利用前面的方法解决。</p>
<h4 id="toc-18">推广二：最大子正方形问题</h4>
<p>模型：在一个矩形钟存在S个障碍点，要求找出最大的不包含障碍点的正方形。</p>
<p>分析：在一个有障碍点的矩形钟的最大有效自证发行一定是一个极大有效子正方形。</p>
<p><strong>注意：每一个极大子矩形对应的极大子正方形可能有多个，但是大小都一样。</strong></p>
<h4 id="toc-19">一些奇怪的东西：</h4>
<p>类型一：矩形中的点都是两条垂直线段的交点，有效子矩形可以在边界包含障碍点。</p>
<p>类型二：矩形中的点是单位方格，有效子矩形不能包含任何障碍点。</p>
<p>处理方法与类型一基本相同</p>
<h4 id="toc-20">最后几句：</h4>
<p>一晚上时间就这么过去了一半，这仅仅是hzwer dalao刷题列表的第一道题，加油啊<strong>IOI选手</strong>！！！！</p>
<h3 id="toc-21">By:Wahacer</h3>
<h3 id="toc-22">资料来源：</h3>
<p>王知昆--浅谈用极大化思想解决最大子矩形问题</p>
<h3 id="toc-23">特别鸣谢：王知昆</h3>


        </div>
  </div>
</div>
<!-- Footer
    ================================================== -->
<footer class="footer">
  <div class="container">
         Copyright (c) 2017 Powered By <a href="https://gitee.com/uncle-lu/oub">OUB</a>
         <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/cn/"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/3.0/cn/88x31.png" /></a><br />本作品采用<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/cn/">知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议</a>进行许可。
  </div>
</footer>
<script>
    $('h1').each(function() {
        $(this).wrap('<section id="' + this.id + '"/>');
    });

    $('h1').wrap('<div class="page-header" />');
    $('h1').wrap('<div class="well well-small" />');

    $(document).ready(function() {
        var items = [];
        $('h1').each(function() {
            items.push('<li><a href="#' + this.id + '"><i class="fa fa-chevron-right pull-right"></i> ' + $(this).text() + '</a></li>');
        });  // close each()

    $('#sidebar_list').append( items.join('') );

    $('table').each(function() {
        $(this).addClass('table table-striped table-condensed table-hover');
    });

    $('.done0').each(function() {
        $(this).html('<div class="alert alert-info"><i class="fa fa-check-square-o"></i>'+$(this).html()+'</div></li>');
    });

    $('.done4').each(function() {
        $(this).html('<div class="alert alert-success"><i class="fa fa-square-o"></i>'+$(this).html()+'</div></li>');
    });
   
    $('pre').each(function() {
        $(this).html('<code>'+$(this).html()+'</code>');
    });
    hljs.initHighlightingOnLoad();
});
</script>
</body>
</html>